﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestionePolveriLib.Facades;
using GestionePolveriLib.BL;
using GestionePolveriLib.Utilities;
using System.Globalization;
using ControlsLib;
using GestionePolveriLib.Facades.Extensions;
using GestionePolveriLib.Validations;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace GestionePolveri2.Editors
{
    public partial class ScaricoDettaglio : DettaglioControlBase
    {
        public enum OperationMode
        {
            Insert=0,
            Update
        }

        public event EventHandler<CustomEventArgs<Turno>> SelectectTurnoChanged;
        public event EventHandler<CustomEventArgs<Impianto>> SelectectImpiantoChanged;
        public event EventHandler<CustomEventArgs<List<Colore>>> MultipleColorsAssociated;
        public event EventHandler<CustomEventArgs<List<Colore>>> NoColorsAssociated;

        private int m_causale;
        private List<Colore> m_coloriAssociati = null;

        private bool m_giacenzaInsufficienteflag = false;
        private bool m_sottoScortaFlag = false;
        private bool m_checkLenght = true;

        private Double quant_old = 0;
        private long idlotto_old = 0;
        private int idPolvere_old = 0;

        private bool m_polveriLoaded = false;
        private bool m_scatoleLoaded = false;
        private bool m_impiantiLoaded = false;
        private bool m_turnoLoaded = false;
        private DateTime m_dataRegistrazione = DateTime.Now;
        private Impianto m_impianto = null;
        private Turno m_turno = null;
        private bool m_impiantiEnabled = false;
        private bool m_turniEnabled = false;

        private string m_famiglie = string.Empty;
        private ImageList m_imageList = null;
        private bool m_dataMovimentoChanged = false;
        private DataMovimentoChangedBag m_dataMovimentoChangedBag = null;

        public DataMovimentoChangedBag DataMovimentoChangedBag
        {
            get { return m_dataMovimentoChangedBag; }
        }

        public bool DataMovimentoChanged
        {
            get { return m_dataMovimentoChanged; }
        }

        public  Movimento OldMovimento { get; set; }

        public bool TurniEnabled
        {
            get { return m_turniEnabled; }
            set 
            { 
                m_turniEnabled = value;
            }
        }

        public bool ImpiantiEnabled
        {
            get { return m_impiantiEnabled; }
            set { m_impiantiEnabled = value; }
        }

        public Impianto Impianto
        {
            get { return (Impianto)this.dyncmbImpianti.SelectedItem; }
            set { m_impianto = value; }
        }

        public Turno Turno
        {
            get { return (Turno)this.dynCmbTurni.SelectedItem; }
            set { m_turno = value; }
        }

        public POS POS { get; set; }

        public List<Colore> ColoriAssociati
        {
            get { return m_coloriAssociati; }
            set { m_coloriAssociati = value; }
        }

        public DateTime DataMovimento
        {
            get { return this.dyndataMovimentoDateTimePicker.Value; }
            set { this.dyndataMovimentoDateTimePicker.Value = value; }
        }

        public DateTime DataRegistrazione
        {
            get { return m_dataRegistrazione; }
            set { m_dataRegistrazione = value; }
        }

        public ScaricoDettaglio()
        {
            InitializeComponent();

            if (!DesignMode)
            {
                picNulli.Visible = false;
                chkbLottiNulli.Visible = false;

                m_imageList = new ImageList();
                m_imageList.Images.Add("NC", GestionePolveri2.Properties.Resources.lgNC);
                m_imageList.Images.Add("NCB", GestionePolveri2.Properties.Resources.lgNC_B);

                this.dynListvLotti.SmallImageList = m_imageList;
            }
        }

        #region Public Methods...
        public MovimentoValidationArgs GetMovimentoValidationArgs(OperationMode operationMode)
        {
            MovimentoValidationArgs retValue = new MovimentoValidationArgs();

            Polvere m_polvere = (Polvere)dynCmbPolveri.SelectedValue;
            LottoFacade lot = new LottoFacade();
            m_polvere.Giacenza = lot.GetGiacenza(m_polvere.ID);

            // nuova regola dopo l'introduzione delle prenotazioni:
            // se la quantità da scaricare è tale che Giacenza - QuantitaImpegnata <=0, impedire lo scarico
            if ((m_polvere.Giacenza - m_polvere.QuantitaImpegnata) <= 0)
            {
                retValue.GiacenzaQuantitaImpegnataFlag = true;
            }

            if ((this.dynListvLotti.CheckedItems.Count > 0) && (this.dynListvLotti.Items.Count > 0))
            {
                Lotto m_lottoSelezionato = (Lotto)this.dynListvLotti.CheckedItems[0].Tag;  // lotto selezionato...
                Lotto m_lottoAnziano = (Lotto)this.dynListvLotti.Items[0].Tag;             // lotto selezionato piu' vecchio...

                if (DateTime.Compare(m_lottoAnziano.DataDdt, m_lottoSelezionato.DataDdt) != 0)
                {
                    retValue.LottoPiuVecchioSelezionatoFlag = false;
                }

                if (DateTime.Compare(m_lottoSelezionato.DataScadenzaLotto, DateTime.Now) < 0)
                {
                    retValue.LottoScadutoSelezionatoFlag = true;
                }

                switch (operationMode)
                {
                    case OperationMode.Insert:
                        {
                            double quant = 0;
                            double num = 0;
                            if (double.TryParse(dynnumScatoleTextBox.Text, out num))
                            {
                                //.......ERRORE: Giacenza totale insufficiente--inizio
                                quant = (num * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura);
                                double m_giac = m_polvere.Giacenza.GetValueOrDefault();
                                if ((Math.Round(m_giac, 2) < Math.Round((quant), 2)) ||
                                    (Math.Round((((Lotto)this.dynListvLotti.CheckedItems[0].Tag).Giacenza), 2) < Math.Round(quant, 2))
                                    )
                                {
                                    retValue.GiacenzaTotaleInsufficienteFlag = true;
                                    m_giacenzaInsufficienteflag = true;
                                }

                                //.......ERRORE: Sottoscorta--inizio
                                if (Math.Round(m_polvere.ScortaMinima, 2) > Math.Round((m_polvere.Giacenza.GetValueOrDefault() - quant), 2))
                                {
                                    retValue.SottoScortaFlag = true;
                                    m_sottoScortaFlag = true;
                                }
                            }
                        }
                        break;
                    case OperationMode.Update:
                        {
                            double quant = 0;
                            double num = 0;
                            if (double.TryParse(dynnumScatoleTextBox.Text, out num))
                            {
                                //.......ERRORE: Giacenza totale insufficiente--inizio
                                quant = (num * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura);
                                double m_giac = m_polvere.Giacenza.GetValueOrDefault();
                                double m_giacOld = m_giac + quant_old;
                                if (Math.Round(m_giacOld, 2) < Math.Round(quant, 2))
                                {
                                    retValue.GiacenzaTotaleInsufficienteFlag = true;
                                    m_giacenzaInsufficienteflag = true;
                                }

                                //.......ERRORE: Giacenza lotto insufficiente--inizio
                                m_giacOld = (((Lotto)this.dynListvLotti.CheckedItems[0].Tag).Giacenza) + quant_old;
                                if (Math.Round(quant, 2) > Math.Round(m_giacOld, 2))
                                {
                                    retValue.GiacenzaTotaleInsufficienteFlag = true;
                                    m_giacenzaInsufficienteflag = true;
                                }

                                //.......ERRORE: Sottoscorta--inizio
                                if (Math.Round(m_polvere.ScortaMinima, 2) > Math.Round((m_polvere.Giacenza.GetValueOrDefault() + quant_old - quant), 2))
                                {
                                    retValue.SottoScortaFlag = true;
                                    m_sottoScortaFlag = true;
                                }
                            }
                        }
                        break;
                    default:
                        break;
                }
            }

            return retValue;
        }

        public double GetPeso()
        {
            double quant = 0;
            double.TryParse(dynntxtWeight.Text, out quant);

            return quant;
        }

        public Movimento GetMovimento()
        {
            Movimento retValue = null;

            if (this.dynCmbTurni.SelectedValue == null)
            {
                MessageBox.Show("Turno mancante. Indicare il Turno...", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return null;
            }
            if (this.dyncmbImpianti.SelectedValue == null)
            {
                MessageBox.Show("Impianto mancante. Indicare l' Impianto...", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return null; 
            }

            if (this.Movimento != null)
            {
                retValue = this.Movimento;
            }
            else
            {
                retValue = new Movimento();
            }

            double quant = 0;
            // inserisco il record relativo al movimento di scarico
            retValue.GiacenzaInsufficienteFlag = m_giacenzaInsufficienteflag;
            retValue.SottoScortaFlag = m_sottoScortaFlag;

            retValue.IDCausale = m_causale;
            retValue.DataMovimento = dyndataMovimentoDateTimePicker.Value;
            retValue.DataRegistrazione = m_dataRegistrazione;

            retValue.IDPolvere = ((Polvere)dynCmbPolveri.SelectedValue).ID;
            retValue.IDFormato = ((Scatola)dyncmbScatole.SelectedValue).ID;
            retValue.Formato = ((Scatola)dyncmbScatole.SelectedValue).Formato;

            double num;
            if (double.TryParse(dynnumScatoleTextBox.Text, out num))
                retValue.NumScatole = num;

            if (this.dynListvLotti.CheckedItems.Count > 0)
            {
                long idlotto = ((Lotto)this.dynListvLotti.CheckedItems[0].Tag).IDLotto;

                LottoFacade l = new LottoFacade();
                Lotto lotto = new Lotto();
                lotto = l.GetLotto(idlotto);

                retValue.Lotto = lotto;
                retValue.IDLotto = lotto.IDLotto; // ((Lotto)this.dynListvLotti.CheckedItems[0].Tag).IDLotto;
            }

            if (double.TryParse(dynntxtWeight.Text, out quant))
            {
                retValue.Quantita = quant;
            }

            retValue.Note = this.dynNoteTextBox.Text;
            
            if(this.dyncmbImpianti.SelectedValue != null)
              retValue.IDImpianto = ((Impianto)(this.dyncmbImpianti.SelectedValue)).ID;
            
            retValue.IDOperatore = this.Principal.Operatore.ID;
            
            retValue.Note = this.dynNoteTextBox.Text;

            if (dynCmbCausaliScarico.SelectedIndex != 0 && dynCmbCausaliScarico.SelectedIndex != -1)
            {
                CausaliScaricoFacade pf = new CausaliScaricoFacade();
                string cod = ((CausaleScarico)(this.dynCmbCausaliScarico.SelectedValue)).CodCausale;
                retValue.IDCausaleScarico = ((CausaleScarico)pf.GetCausaleScarico(cod)).ID;
            }

            retValue.POS = (this.POS != null ? this.POS.POSValue : (this.Movimento != null ? this.Movimento.POS : null));
            retValue.IDTurno = ((Turno)this.dynCmbTurni.SelectedValue).Id;
            retValue.Turno = (Turno)this.dynCmbTurni.SelectedValue;
            retValue.ImpiantoInternal = (Impianto)this.dyncmbImpianti.SelectedValue;

            return retValue;
        }

        public override bool Add()
        {
            bool retValue = false;

            if (Validate("A"))
            //if (ApplyRules())
            {
                using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
                {
                    double quant = 0;
                    // inserisco il record relativo al movimento di scarico
                    Movimento imp = new Movimento();
                    imp.GiacenzaInsufficienteFlag = m_giacenzaInsufficienteflag;
                    imp.SottoScortaFlag = m_sottoScortaFlag;

                    imp.IDCausale = m_causale;
                    imp.DataMovimento = dyndataMovimentoDateTimePicker.Value;
                    imp.DataRegistrazione = m_dataRegistrazione;

                    imp.IDPolvere = ((Polvere)dynCmbPolveri.SelectedValue).ID;
                    imp.IDFormato = ((Scatola)dyncmbScatole.SelectedValue).ID;
                    imp.Formato = ((Scatola)dyncmbScatole.SelectedValue).Formato;

                    double num;
                    if (double.TryParse(dynnumScatoleTextBox.Text, out num))
                        imp.NumScatole = num;

                    long idlotto = ((Lotto)this.dynListvLotti.CheckedItems[0].Tag).IDLotto;

                    LottoFacade l = new LottoFacade();
                    Lotto lotto = new Lotto();
                    lotto = l.GetLotto(idlotto);

                    if (double.TryParse(dynntxtWeight.Text, out quant))
                    {
                        imp.Quantita = quant;
                        //imp.Giacenza = lotto.Giacenza - quant;
                        //imp.Valore = imp.Giacenza * lotto.PrezzoUnitario;
                    }

                    imp.Note = this.dynNoteTextBox.Text;
                    imp.IDImpianto = ((Impianto)(this.dyncmbImpianti.SelectedValue)).ID;
                    imp.IDOperatore = this.Principal.Operatore.ID;
                    imp.IDLotto = ((Lotto)this.dynListvLotti.CheckedItems[0].Tag).IDLotto;

                    imp.Note = this.dynNoteTextBox.Text;

                    if (dynCmbCausaliScarico.SelectedIndex != 0 && dynCmbCausaliScarico.SelectedIndex != -1)
                    {
                        CausaliScaricoFacade pf = new CausaliScaricoFacade();
                        string cod = ((CausaleScarico)(this.dynCmbCausaliScarico.SelectedValue)).CodCausale;
                        imp.IDCausaleScarico = ((CausaleScarico)pf.GetCausaleScarico(cod)).ID;
                    }

                    imp.POS = this.POS.POSValue;
                    imp.IDTurno = this.POS.IDTurno;
                    
                    MovimentiFacade impf = new MovimentiFacade();
                    impf.AddMovimento(imp);

                    // gestione dello stato di movimentazione del lotto...
                    l.UpdateStatoMovimentazione(imp.IDLotto, true);

                    // aggiunge i colori associati alla polvere movimentata nello storico colori movimenti...
                    //impf.AddToStoricoColoriMovimenti(imp.IDMovimento, m_coloriAssociati, "I");

                    // aggiunge la traccia nello storico movimenti...
                    //impf.AddToStoricoMovimenti(imp);

                    //Aggiorno la giacenza lotto
                    LottoFacade lot = new LottoFacade();
                    lot.AggLotto(idlotto, quant);

                    //impf.AddToStoricoMovimenti(imp);

                    transaction.Complete();

                    this.Movimento = imp;

                    MessageBox.Show("Inserimento Effettuato con successo !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    retValue = true;
                }

                OnLoadData(EventArgs.Empty);
            }

            return retValue;
        }

        public override bool Modify()
        {
            bool retValue = false;

            if (Validate("M"))
            //if (ApplyRules())
            {
                using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
                {
                    Movimento imp = new Movimento();
                    imp.IDMovimento = this.Movimento.IDMovimento;
                    imp.IDCausale = m_causale;
                    imp.DataMovimento = dyndataMovimentoDateTimePicker.Value;
                    imp.DataRegistrazione = m_dataRegistrazione;

                    imp.IDPolvere = ((Polvere)dynCmbPolveri.SelectedValue).ID;
                    imp.IDFormato = ((Scatola)dyncmbScatole.SelectedValue).ID;

                    Lotto m_lotto = (Lotto)this.dynListvLotti.CheckedItems[0].Tag;
                    imp.NumDdt = m_lotto.NumDdt;
                    imp.DataDdt = m_lotto.DataDdt;

                    double num;
                    if (double.TryParse(dynnumScatoleTextBox.Text, out num))
                        imp.NumScatole = num;

                    imp.GiacenzaInsufficienteFlag = m_giacenzaInsufficienteflag;
                    imp.SottoScortaFlag = m_sottoScortaFlag;

                    double quant;
                    if (double.TryParse(dynntxtWeight.Text, out quant))
                    {
                        imp.Quantita = quant;
                        imp.Giacenza = imp.Giacenza + quant_old - quant;
                    }

                    long m_idlotto = ((Lotto)this.dynListvLotti.CheckedItems[0].Tag).IDLotto;

                    imp.Note = this.dynNoteTextBox.Text;
                    imp.IDImpianto = ((Impianto)(this.dyncmbImpianti.SelectedValue)).ID;
                    imp.IDOperatore = this.Principal.Operatore.ID;
                    //imp.IDLotto = base.Current.IDLotto;
                    imp.IDLotto = m_idlotto;
                    this.Movimento.IDLotto = m_idlotto;
                    imp.Note = this.dynNoteTextBox.Text;
                    imp.IsCloned = this.Movimento.IsCloned;

                    if (dynCmbCausaliScarico.SelectedIndex != 0 && dynCmbCausaliScarico.SelectedIndex != -1)
                    {
                        CausaliScaricoFacade pf = new CausaliScaricoFacade();
                        string cod = ((CausaleScarico)(this.dynCmbCausaliScarico.SelectedValue)).CodCausale;
                        imp.IDCausaleScarico = ((CausaleScarico)pf.GetCausaleScarico(cod)).ID;
                    }

                    imp.POS = this.POS.POSValue;
                    imp.IDTurno = this.POS.IDTurno;

                    MovimentiFacade impf = new MovimentiFacade();
                    impf.ModifyMovimento(imp);

                    // aggiunge i colori associati in quel momento alla polvere movimentata nello storico colori movimenti...
                    //impf.AddToStoricoColoriMovimenti(imp.IDMovimento, m_coloriAssociati, "M");

                    //Ripristino giacenza lotto vecchio                                                             
                    LottoFacade lot = new LottoFacade();
                    lot.RipristinoLotto(idlotto_old, quant_old);

                    //Aggiorno la giacenza lotto nuovo
                    long idlotto = ((Lotto)this.dynListvLotti.CheckedItems[0].Tag).IDLotto;
                    lot.AggLotto(idlotto, quant);
                    //

                    //MovimentiFacade mf = new MovimentiFacade();
                    //mf.AggMovimento(imp.IDMovimento);

                    transaction.Complete();

                    this.Movimento = imp;

                    MessageBox.Show("Modifica Effettuata con successo !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    retValue = true;
                }

                OnLoadData(EventArgs.Empty);
            }

            return retValue;
        }

        public override bool Delete()
        {
            bool retValue = false;

            Movimento imp = new Movimento();
            imp.IDMovimento = this.Movimento.IDMovimento;
            //30/06/2012
            MovimentiFacade impf = new MovimentiFacade();
            imp = impf.GetMovimento(this.Movimento.IDMovimento);

            using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
            {
                LottoFacade lot = new LottoFacade();

                if (lot.RipristinoLotto(idlotto_old, quant_old))
                {
                    if (impf.DeleteFisicaMovimento(imp))
                    {
                        if (lot.CheckStatoMovimentazione(imp.IDLotto))
                        {
                            transaction.Complete();

                            MessageBox.Show("Cancellazione Effettuata con successo !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            retValue = true;
                        }
                        else
                        {
                            MessageBox.Show("Cancellazione Fallita !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                }
            }

            OnLoadData(EventArgs.Empty);

            return retValue;
        }

        public override void ClearControls()
        {
            m_giacenzaInsufficienteflag = false;
            m_sottoScortaFlag = false;

            //this.dyndataMovimentoDateTimePicker.Value = DateTime.Now;
            this.dynnumScatoleTextBox.Text = string.Empty;
            this.dynntxtWeight.Text = string.Empty;

            this.dynListvLotti.Items.Clear();

            this.lblNumDDT.Text = "Num. DDT:";
            this.lblDataDDT.Text = "Data DDT:";
            this.lblDescrizionePolvere.Text = "Polvere:";
            this.lblFornitoreDescrizione.Text = "Fornitore:";
        }

        public override bool Validate(string op)
        {
            bool retValue = true;
            decimal num = 0;

            //if (((Impianto)dyncmbImpianti.SelectedValue).Nome == string.Empty)
            if (dynCmbTurni.SelectedIndex == 0)
            {
                retValue = false;
                //MessageBox("Attenzione!... e' necessario selezionare un impianto");
                MessageBox.Show("Attenzione!... e' necessario selezionare un turno");
                return retValue;
            }

            //if (((Impianto)dyncmbImpianti.SelectedValue).Nome == string.Empty)
            if (dyncmbImpianti.SelectedIndex == 0)
            {
                retValue = false;
                //MessageBox("Attenzione!... e' necessario selezionare un impianto");
                MessageBox.Show("Attenzione!... e' necessario selezionare un impianto");
                return retValue;
            }

            if (dynCmbPolveri.SelectedIndex == 0)
            {
                retValue = false;
                MessageBox.Show("Selezionare un codice polvere");
                return retValue;
            }

            if (this.dynListvLotti.CheckedItems.Count == 0)
            {
                retValue = false;
                MessageBox.Show("Attenzione!... e' necessario selezionare un lotto");
                //this.ShowNotBlockingMessage("Attenzione!... e' necessario selezionare un lotto", MessageBoxIcon.Error);

                return retValue;
            }

            Lotto m_lotto = (Lotto)this.dynListvLotti.CheckedItems[0].Tag;
            if ((m_lotto.LottoNCInfo != null) && (m_lotto.LottoNCInfo.IsLottoBloccato.GetValueOrDefault()))
            {
                Impianto imp = (Impianto)dyncmbImpianti.SelectedItem;
                if (!imp.Fittizio)
                {
                    retValue = false;
                    MessageBox.Show("Il Lotto risulta Non Conforme e Bloccato.\nVerificare che l'impianto utilizzato sia un impianto fittizio!");
                    return retValue;
                }                
            }

            if (!(decimal.TryParse(dynnumScatoleTextBox.Text, out num)))
            {
                retValue = false;
                MessageBox.Show("Valore non numerico per numero scatole");

                //this.ShowNotBlockingMessage("Indicare un valore numerico per numero scatole", MessageBoxIcon.Error);
                return retValue;
            }

            if (num < 0)  // =
            {
                retValue = false;
                MessageBox.Show("Numero scatole non valido. Inserire un valore maggiore di zero");
                return retValue;
            }
            else
            {
                retValue = DoChecks(op);
            }

            return retValue;
        }

        private void SetupData()
        {
            if (m_polveriLoaded && m_scatoleLoaded && m_impiantiLoaded && m_turnoLoaded)
            {
                this.dynCmbTurni.SelectedIndexChanged += new EventHandler(dynCmbTurni_SelectedIndexChanged);
                this.dynCmbPolveri.SelectedIndexChanged += new EventHandler(dynCmbPolveri_SelectedIndexChanged);

                if (this.Movimento != null)
                {
                    SetMovimento();
                }
            }
        }

        public override void InitializeControl()
        {
            this.dynListvLotti.MultiSelect = false;

            this.Principal = (OperatorePrincipal)this.Principal;

            CausaliMagazzinoFacade cmf = new CausaliMagazzinoFacade();
            m_causale = cmf.GetCausaleByCod("S").ID;

            this.dynnumScatoleTextBox.KeyDown += new KeyEventHandler(dynnumScatoleTextBox_KeyDown);
            this.dynnumScatoleTextBox.TextChanged -= new EventHandler(dynnumScatoleTextBox_TextChanged);
            this.dyncmbImpianti.SelectedIndexChanged -= new EventHandler(dyncmbImpianti_SelectedIndexChanged);
            this.dynCmbTurni.SelectedIndexChanged -= new EventHandler(dynCmbTurni_SelectedIndexChanged);
            this.dyncmbScatole.SelectedIndexChanged -= new EventHandler(dyncmbScatole_SelectedIndexChanged);
            this.dynCmbPolveri.SelectedIndexChanged -= new EventHandler(dynCmbPolveri_SelectedIndexChanged);

            LoadScatole();
            LoadImpianti();
            LoadCausaliScarico();
            LoadPolveri();
            LoadTurni();

            System.Threading.Thread.Sleep(1000);

            OnLoadData(EventArgs.Empty);

            dynntxtWeight.Enabled = false;
            dynnumScatoleTextBox.Enabled = false;
        }

        void dynCmbTurni_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.POS = POS.GetCurrentPOS((Turno)this.dynCmbTurni.SelectedItem, Principal.Operatore, this.Impianto, DateTime.Now);

            if (this.SelectectTurnoChanged != null)
            {
                this.SelectectTurnoChanged(this, new CustomEventArgs<Turno>(Actions.FromCombo, (Turno)this.dynCmbTurni.SelectedItem));
            }
        }

        void dyncmbImpianti_SelectedIndexChanged(object sender, EventArgs e)
        {
            if ((SelectectImpiantoChanged != null) && (((Impianto)this.dyncmbImpianti.SelectedItem).ID != -1))
            {
                SelectectImpiantoChanged(sender, new CustomEventArgs<Impianto>(Actions.ItemSelected, (Impianto)this.dyncmbImpianti.SelectedItem));
            }
        }

        public override void SetMovimento()
        {
            this.lblNumDDT.Text = string.Format("Num. DDT: {0}", this.Movimento.NumDdt);
            this.lblDataDDT.Text = string.Format("Data DDT: {0}", this.Movimento.DataDdt.ToShortDateString());

            this.dyndataMovimentoDateTimePicker.Value = this.Movimento.DataMovimento;
            this.dynnumScatoleTextBox.Text = this.Movimento.NumScatole.ToString("F");
            this.dynntxtWeight.Text = (this.Movimento.NumScatole * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura).ToString("F");
            //this.dynntxtWeight.Text = (this.Movimento.NumScatole * this.Movimento.Quantita).ToString("F");
            quant_old = this.Movimento.Quantita;
            idlotto_old = this.Movimento.IDLotto;
            idPolvere_old = this.Movimento.IDPolvere;

            // DEEP CLONE...
            using (MemoryStream stream = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, this.Movimento);
                stream.Position = 0;
                this.OldMovimento = (Movimento)formatter.Deserialize(stream);
            }
            // DEEP CLONE...

            this.SelectComboItem(this.dynCmbPolveri, this.Movimento.CodicePolvere);

            this.SelectComboItem(this.dyncmbScatole, this.Movimento.Formato);

            this.SelectComboItem(this.dyncmbImpianti, this.Movimento.Impianto);

            this.dynNoteTextBox.Text = this.Movimento.Note;

            LoadLotti(this.Movimento.IDPolvere, this.Movimento.IDLotto);
        }
        #endregion

        #region Load Methods...
        private void LoadPolveri()
        {
            PolvereFacade pf = new PolvereFacade();
            pf.RunAsync<List<Polvere>>(() => pf.GetPolveriForCS2(), (result) =>
            {
                if (result != null)
                {
                    List<Polvere> m_data = new List<Polvere>();
                    m_data.Add(new Polvere() { CodicePolvere = "Seleziona una polvere", ID = -1 });
                    m_data.AddRange((List<Polvere>)result);

                    this.dynCmbPolveri.DisplayMember = "CodicePolvere";
                    this.dynCmbPolveri.ValueMember = "ID";
                    this.dynCmbPolveri.DataSource = m_data;

                    m_polveriLoaded = true;

                    SetupData();

                    //this.dynCmbPolveri.SelectedIndexChanged += new EventHandler(dynCmbPolveri_SelectedIndexChanged);
                }
            });
        }

        private void LoadColori()
        {
            ComposizioneColoreFacadeExt pf = new ComposizioneColoreFacadeExt();
            pf.LoadAsync((result) =>
            {
                if (this.dynCmbPolveri.SelectedValue == null) return;

                m_coloriAssociati = pf.GetColoriAssociati(((Polvere)this.dynCmbPolveri.SelectedValue).ID);

                if (m_coloriAssociati != null)
                {
                    this.dynLVColoriAbbinati.Items.Clear();
                    m_famiglie = string.Empty;
                    foreach (Colore c in m_coloriAssociati)
                    {
                        ListViewItem item = new ListViewItem(c.CodiceColore);

                        ListViewItem.ListViewSubItem subitem = new ListViewItem.ListViewSubItem(item, c.Applicazione);
                        item.SubItems.Add(subitem);

                        ListViewItem.ListViewSubItem subitem1 = new ListViewItem.ListViewSubItem(item, c.FamigliaDescrizione);
                        item.SubItems.Add(subitem1);

                        this.dynLVColoriAbbinati.Items.Add(item);

                        if (!m_famiglie.Contains(c.Famiglia.ID.ToString()))
                            m_famiglie += c.Famiglia.ID.ToString() + ",";
                    };

                    if (m_famiglie != string.Empty)
                        m_famiglie = m_famiglie.Substring(0, m_famiglie.LastIndexOf(','));

                    if (MultipleColorsAssociated != null)
                    {
                        // la polvere ha associato piu' di un colore, quindi il verniciatore deve avere la possibilità di sceglierne uno...
                        MultipleColorsAssociated(this, new CustomEventArgs<List<Colore>>(Actions.ItemSelected, m_coloriAssociati));
                    }
                }
            });
        }

        private void LoadScatole()
        {
            ScatoleFacade pf = new ScatoleFacade();

            pf.LoadScatoleAsync((result) =>
            {
                List<Scatola> m_data = new List<Scatola>();
                m_data.Add(new Scatola() { Formato = "Seleziona un formato", ID = -1 });
                m_data.AddRange((List<Scatola>)result);

                this.dyncmbScatole.DisplayMember = "Formato";
                this.dyncmbScatole.ValueMember = "ID";

                this.dyncmbScatole.DataSource = m_data;

                m_scatoleLoaded = true;
                
                SetupData();

                this.dynnumScatoleTextBox.TextChanged -= new EventHandler(dynnumScatoleTextBox_TextChanged);
                this.dynntxtWeight.TextChanged -= new EventHandler(dynntxtWeight_TextChanged);
                this.dyncmbScatole.SelectedIndexChanged -= new EventHandler(dyncmbScatole_SelectedIndexChanged);

                if (this.Movimento != null)
                {
                    //this.dynnumScatoleTextBox.TextChanged -= new EventHandler(dynnumScatoleTextBox_TextChanged);
                    //this.dynntxtWeight.TextChanged -= new EventHandler(dynntxtWeight_TextChanged);
                    //this.dyncmbScatole.SelectedIndexChanged -= new EventHandler(dyncmbScatole_SelectedIndexChanged);

                    this.SelectComboItem(this.dyncmbScatole, this.Movimento.Formato);

                    this.dynnumScatoleTextBox.Text = this.Movimento.NumScatole.ToString("F");
                    this.dynntxtWeight.Text = (this.Movimento.NumScatole * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura).ToString("F");

                    //this.dyncmbScatole.SelectedIndexChanged += new EventHandler(dyncmbScatole_SelectedIndexChanged);
                    //this.dynntxtWeight.TextChanged += new EventHandler(dynntxtWeight_TextChanged);
                    //this.dynnumScatoleTextBox.TextChanged += new EventHandler(dynnumScatoleTextBox_TextChanged);
                }

                this.dyncmbScatole.SelectedIndexChanged += new EventHandler(dyncmbScatole_SelectedIndexChanged);
                this.dynntxtWeight.TextChanged += new EventHandler(dynntxtWeight_TextChanged);
                this.dynnumScatoleTextBox.TextChanged += new EventHandler(dynnumScatoleTextBox_TextChanged);
            });
        }

        private void LoadImpianti()
        {
            ImpiantoFacade pf = new ImpiantoFacade();
            pf.LoadImpiantoAsync((result) =>
            {
                List<Impianto> m_data = new List<Impianto>();
                m_data.Add(new Impianto() { Nome = "Seleziona un impianto", ID = -1 });
                m_data.AddRange((List<Impianto>)result);

                this.dyncmbImpianti.DisplayMember = "Nome";
                this.dyncmbImpianti.ValueMember = "ID";
                this.dyncmbImpianti.DataSource = m_data;

                m_impiantiLoaded = true;
                
                SetupData();
                
                if (this.Movimento != null)
                {
                    this.SelectComboItem(this.dyncmbImpianti, this.Movimento.Impianto);
                }

                if (m_impianto != null)
                {
                    this.SelectComboItem(this.dyncmbImpianti, m_impianto.Nome);
                    
                    this.dyncmbImpianti.Enabled = m_impiantiEnabled;
                }

                this.dyncmbImpianti.SelectedIndexChanged += new EventHandler(dyncmbImpianti_SelectedIndexChanged);
            });
        }

        private void LoadTurni()
        {
            TurniFacade tf = new TurniFacade();

            tf.LoadTurniAsync((result) =>
            {
                List<Turno> m_data = new List<Turno>();
                m_data.Add(new Turno() { Descrizione = "Seleziona un turno", Id = -1 });
                m_data.AddRange((List<Turno>)result);

                this.dynCmbTurni.DisplayMember = "Descrizione";
                this.dynCmbTurni.ValueMember = "ID";
                this.dynCmbTurni.DataSource = m_data;

                m_turnoLoaded = true;

                SetupData();

                if (this.Turno != null)
                {
                    this.SelectComboItem(this.dynCmbTurni, this.Turno.Descrizione);
                }

                if (m_turno != null)
                {
                    this.SelectComboItem(this.dynCmbTurni, m_turno.Descrizione);
                    this.dynCmbTurni.Enabled = m_turniEnabled;

                    if (this.Principal.IsInRole("Amministrazione"))
                    {
                        m_turniEnabled = true;
                        this.dynCmbTurni.Enabled = m_turniEnabled;
                    }
                }

                this.dynCmbTurni.SelectedIndexChanged += new EventHandler(dynCmbTurni_SelectedIndexChanged);
            });
        }

        private void LoadCausaliScarico()
        {
            CausaliScaricoFacade pf = new CausaliScaricoFacade();
            pf.LoadAsync((result) =>
            {
                List<CausaleScarico> m_data = new List<CausaleScarico>();
                m_data.Add(new CausaleScarico() { Descrizione = "Seleziona una causale", ID = -1 });
                m_data.AddRange(pf.GetAll());

                this.dynCmbCausaliScarico.DisplayMember = "Descrizione";
                this.dynCmbCausaliScarico.ValueMember = "ID";
                this.dynCmbCausaliScarico.DataSource = m_data;

                this.dynCmbCausaliScarico.Enabled = true;
                if (this.Movimento != null)
                {
                    this.SelectComboItem(this.dynCmbCausaliScarico, this.Movimento.CausaleScarico);
                    if (this.Movimento.CausaleScarico == "I")
                        this.dynCmbCausaliScarico.Enabled = false;
                }
            });
        }

        private void LoadLotti(long idPolvere, long idlotto)
        {
            LottoFacade pf = new LottoFacade();
            pf.LoadAsync((result) =>
            {
                this.dynListvLotti.Items.Clear();

                if (result != null)
                {
                    this.dynListvLotti.ItemChecked -= new ItemCheckedEventHandler(dynListvLotti_ItemChecked);

                    foreach (Lotto lt in (List<Lotto>)result)
                    {
                        ListViewItem item = new ListViewItem(lt.CodLotto);

                        item.Name = lt.CodLotto;
                        item.Tag = lt;

                        LottoNCInfo m_lottoNCInfo = pf.CheckIfNC(lt.IDLotto);
                        if (m_lottoNCInfo != null)
                        {
                            if ((m_lottoNCInfo.IsLottoBloccato.HasValue) && (m_lottoNCInfo.IsLottoBloccato.Value))
                            {
                                item.ImageKey = "NCB";
                            }
                            else
                            {
                                if ((m_lottoNCInfo.IsLottoNC.HasValue) && (m_lottoNCInfo.IsLottoNC.Value))
                                {
                                    item.ImageKey = "NC";
                                }
                            }

                            lt.LottoNCInfo = m_lottoNCInfo;
                        }
                        
                        ListViewItem.ListViewSubItem sItem1 = new ListViewItem.ListViewSubItem(item, lt.DataDdt.ToShortDateString());
                        ListViewItem.ListViewSubItem sItem2 = new ListViewItem.ListViewSubItem(item, lt.DataScadenzaLotto.ToShortDateString());
                        ListViewItem.ListViewSubItem sItem3 = new ListViewItem.ListViewSubItem(item, lt.Giacenza.ToString());
                        ListViewItem.ListViewSubItem sItem4 = new ListViewItem.ListViewSubItem(item, lt.CodicePolvere);
                        ListViewItem.ListViewSubItem sItem5 = new ListViewItem.ListViewSubItem(item, lt.Fornitore);
                        ListViewItem.ListViewSubItem sItem6 = new ListViewItem.ListViewSubItem(item, lt.NoteCarico);

                        item.SubItems.Add(sItem1);
                        item.SubItems.Add(sItem2);
                        item.SubItems.Add(sItem3);
                        item.SubItems.Add(sItem4);
                        item.SubItems.Add(sItem5);
                        item.SubItems.Add(sItem6);

                        this.dynListvLotti.Items.Add(item);

                        if (idlotto != 0)
                        {
                            if (lt.IDLotto == idlotto)
                            {
                                item.Checked = true;
                            }
                            else
                            {
                                item.Checked = false;
                            }
                        }
                    }

                    this.dynListvLotti.ItemChecked += new ItemCheckedEventHandler(dynListvLotti_ItemChecked);
                }
            }, idPolvere);
        }

        private void LoadLottiAll(long idPolvere, long idlotto)
        {
            LottoFacade pf = new LottoFacade();
            pf.LoadAsyncAll((result) =>
            {
                this.dynListvLotti.Items.Clear();

                if (result != null)
                {
                    this.dynListvLotti.ItemChecked -= new ItemCheckedEventHandler(dynListvLotti_ItemChecked);

                    foreach (Lotto lt in (List<Lotto>)result)
                    {
                        ListViewItem item = new ListViewItem(lt.CodLotto);

                        item.Name = lt.CodLotto;
                        item.Tag = lt;

                        LottoNCInfo m_lottoNCInfo = pf.CheckIfNC(lt.IDLotto);
                        if (m_lottoNCInfo != null)
                        {
                            if ((m_lottoNCInfo.IsLottoBloccato.HasValue) && (m_lottoNCInfo.IsLottoBloccato.Value))
                            {
                                item.ImageKey = "NCB";
                            }
                            else
                            {
                                if ((m_lottoNCInfo.IsLottoNC.HasValue) && (m_lottoNCInfo.IsLottoNC.Value))
                                {
                                    item.ImageKey = "NC";
                                }
                            }

                            lt.LottoNCInfo = m_lottoNCInfo;
                        }

                        ListViewItem.ListViewSubItem sItem1 = new ListViewItem.ListViewSubItem(item, lt.DataDdt.ToShortDateString());
                        ListViewItem.ListViewSubItem sItem2 = new ListViewItem.ListViewSubItem(item, lt.DataScadenzaLotto.ToShortDateString());
                        ListViewItem.ListViewSubItem sItem3 = new ListViewItem.ListViewSubItem(item, lt.Giacenza.ToString());
                        ListViewItem.ListViewSubItem sItem4 = new ListViewItem.ListViewSubItem(item, lt.CodicePolvere);
                        ListViewItem.ListViewSubItem sItem5 = new ListViewItem.ListViewSubItem(item, lt.Fornitore);
                        ListViewItem.ListViewSubItem sItem6 = new ListViewItem.ListViewSubItem(item, lt.NoteCarico);

                        item.SubItems.Add(sItem1);
                        item.SubItems.Add(sItem2);
                        item.SubItems.Add(sItem3);
                        item.SubItems.Add(sItem4);
                        item.SubItems.Add(sItem5);
                        item.SubItems.Add(sItem6);

                        this.dynListvLotti.Items.Add(item);

                        if (idlotto != 0)
                        {
                            if (lt.IDLotto == idlotto)
                            {
                                item.Checked = true;
                            }
                            else
                            {
                                item.Checked = false;
                            }
                        }
                    }
                    this.dynListvLotti.ItemChecked += new ItemCheckedEventHandler(dynListvLotti_ItemChecked);
                }
            }, idPolvere);
        }
        #endregion

        #region Event Handlers...
        void dynntxtWeight_TextChanged(object sender, EventArgs e)
        {
            if (this.dyncmbScatole.SelectedIndex != -1)
            {
                if (string.IsNullOrWhiteSpace(this.dynntxtWeight.Text))
                {
                    this.dynnumScatoleTextBox.ResetText();
                }
                else
                {
                    CalcolaQuantita();
                }
            }
        }

        void dynnumScatoleTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if ((e.KeyCode == Keys.Delete) || (e.KeyCode == Keys.Back))
            {
                m_checkLenght = false;
            }
            else
            {
                m_checkLenght = true;
            }
        }

        void dynnumScatoleTextBox_TextChanged(object sender, EventArgs e)
        {
            //CalcolaQuantita();
            if (string.IsNullOrWhiteSpace(this.dynnumScatoleTextBox.Text))
            {
                this.dynntxtWeight.ResetText();
            }
            else
            {
                if ((this.dynnumScatoleTextBox.Text.Length == 2) && (m_checkLenght))
                {
                    this.dynnumScatoleTextBox.Text += "0";
                }

                CalcolaPeso();
            }
            
        }

        void dyncmbScatole_SelectedIndexChanged(object sender, EventArgs e)
        {
            CalcolaQuantita();
            CalcolaPeso();
        }

        void dynListvLotti_ItemChecked(object sender, ItemCheckedEventArgs e)
        {
            dynntxtWeight.Enabled = e.Item.Checked;
            dynnumScatoleTextBox.Enabled = e.Item.Checked;

            // controllo che l'item sia selezionato e nel caso che ne sia selezionato uno solo...
            if (!e.Item.Checked) return;

            if ((e.Item.Checked) && (this.dynListvLotti.CheckedItems.Count > 1))
            {
                e.Item.Checked = false;
                return;
            }

            Lotto m_lotto = (Lotto)e.Item.Tag;

            this.lblNumDDT.Text = string.Format("Num. DDT: {0}", m_lotto.NumDdt);
            this.lblDataDDT.Text = string.Format("Data DDT: {0}", m_lotto.DataDdt.ToShortDateString());

            ScatoleFacade sf = new ScatoleFacade();
            Scatola scatola = new Scatola();

            scatola = sf.GetScatolaByLotto(m_lotto.IDLotto, "C");
            this.SelectComboItem(this.dyncmbScatole, scatola.Formato);
        }

        void dynTxtSearch_KeyUp(object sender, KeyEventArgs e)
        {

        }

        void dynCmbPolveri_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadColori();

            Polvere m_polvere = (Polvere)this.dynCmbPolveri.SelectedValue;
            if (m_polvere != null)
            {
                if (m_polvere.ID != -1)
                {
                    LottoFacade lf = new LottoFacade();
                    m_polvere.Giacenza = lf.GetGiacenza(m_polvere.ID);

                    PrenotazioniFacade pf = new PrenotazioniFacade();
                    m_polvere.QuantitaImpegnata = pf.GetQuantitaImpegnata(m_polvere.ID);

                    LottoNCFacade lncf = new LottoNCFacade();
                    m_polvere.QuantitaNCBlocked = lncf.GetQuantitaBlocked(m_polvere.ID);

                    this.prenotazioneInfoUC1.Polvere = m_polvere;

                    if (m_polvere.QuantitaImpegnata > 0)
                    {
                        if (MessageBox.Show("Sono presenti delle quantità prenotate per la polvere scelta.\nVuoi annullare una o piu' prenotazioni ?",
                                           "Gestione Polveri", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                        {
                            ElencoPrenotazioni ep = new ElencoPrenotazioni();
                            ep.StartPosition = FormStartPosition.CenterScreen;
                            ep.MinimizeBox = false;
                            ep.MaximizeBox = false;
                            ep.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
                            ep.Polvere = m_polvere;
                            ep.Load += (s, ev) => ep.InitializeForm();

                            if (ep.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                            {
                                m_polvere.Giacenza = lf.GetGiacenza(m_polvere.ID);
                                m_polvere.QuantitaImpegnata = pf.GetQuantitaImpegnata(m_polvere.ID);
                                m_polvere.QuantitaNCBlocked = lncf.GetQuantitaBlocked(m_polvere.ID);

                                this.prenotazioneInfoUC1.Polvere = m_polvere;
                            }
                        }
                    }

                    if (this.Movimento == null)
                    {
                        LoadLotti(m_polvere.ID, 0);
                    }
                    else
                    {
                        LoadLotti(m_polvere.ID, this.Movimento.IDLotto);
                    }

                    this.lblDescrizionePolvere.Text = string.Format("Polvere: {0}", m_polvere.Descrizione);
                    this.lblFornitoreDescrizione.Text = string.Format("Fornitore: {0}", m_polvere.Fornitore.Descrizione);
                    this.dynNotePolvere.Text = string.Format("Note: {0}", m_polvere.Note);

                    List<Lotto> lots = lf.GetLottiNulli(m_polvere.ID);
                    if (lots != null)
                    {
                        picNulli.Visible = true;
                        chkbLottiNulli.Visible = true;
                    }
                    else
                    {
                        picNulli.Visible = false;
                        chkbLottiNulli.Visible = false;
                    }

                }
            }
        }
        #endregion

        #region Private Methods
        private decimal CalcolaQuantita()
        {
            this.dynnumScatoleTextBox.TextChanged -= new EventHandler(dynnumScatoleTextBox_TextChanged);

            decimal quant = 0;
            decimal peso = 0;

            NumberStyles style;
            CultureInfo culture;

            style = NumberStyles.Number | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands;
            culture = CultureInfo.CreateSpecificCulture("it-IT");

            if (!(this.dyncmbScatole.SelectedIndex == -1) && (decimal.TryParse(this.dynntxtWeight.Text, style, culture, out peso)))
            {
                if (((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura != 0)
                {
                    quant = peso / ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura;

                    string p = quant.ToString("F");

                    this.dynnumScatoleTextBox.Text = p; // quant.ToString(); //.ToString("F");
                }
            }

            this.dynnumScatoleTextBox.TextChanged += new EventHandler(dynnumScatoleTextBox_TextChanged);

            return quant;
        }

        private decimal CalcolaPeso()
        {
            this.dynntxtWeight.TextChanged -= new EventHandler(dynntxtWeight_TextChanged);

            decimal quant = 0;
            decimal num = 0;

            NumberStyles style;
            CultureInfo culture;

            style = NumberStyles.Number | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands;
            culture = CultureInfo.CreateSpecificCulture("it-IT");


            if (!(this.dyncmbScatole.SelectedIndex == -1) && (decimal.TryParse(dynnumScatoleTextBox.Text, style, culture, out num)))
            {
                quant = num * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura;
                this.dynntxtWeight.Text = quant.ToString("F");
            }

            this.dynntxtWeight.TextChanged += new EventHandler(dynntxtWeight_TextChanged);

            return quant;
        }

        private bool DoChecks(string ope)
        {
            bool retValue = true;
            double quant = 0;
            double num = 0;

            Polvere m_polvere = (Polvere)dynCmbPolveri.SelectedValue;
            LottoFacade lot = new LottoFacade();

            m_polvere.Giacenza = lot.GetGiacenza(m_polvere.ID);

            // nuova regola dopo l'introduzione delle prenotazioni:
            // se la quantità da scaricare è tale che Giacenza - QuantitaImpegnata >=0
            if ((m_polvere.Giacenza - m_polvere.QuantitaImpegnata) < 0)
            {
                MessageBox.Show("Attenzione!...Giacenza - Quantita Impegnata < 0", "Conferma Aggiornamento", MessageBoxButtons.OK);

                retValue = false;
                return retValue;
            }

            if (double.TryParse(dynnumScatoleTextBox.Text, out num))
            {
                //.......ERRORE: Giacenza totale insufficiente--inizio
                quant = (num * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura);
                if (ope == "A")
                {
                    //quant = (num * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura);
                    double m_giac = m_polvere.Giacenza.GetValueOrDefault();
                    if (Math.Round(m_giac, 2) < Math.Round((quant), 2))
                    {
                        m_giacenzaInsufficienteflag = true;

                        if (System.Windows.Forms.MessageBox.Show("Attenzione!...Giacenza totale insufficiente. Continuare?",
                                           "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            retValue = false;
                            return retValue;
                        }
                    }
                }
                if (ope == "M")
                {
                    quant = (num * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura);
                    double m_giac = m_polvere.Giacenza.GetValueOrDefault();

                    //quant = num * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura;
                    double m_giacOld = m_giac + quant_old;
                    if (Math.Round(m_giacOld, 2) < Math.Round(quant, 2))
                    {
                        m_giacenzaInsufficienteflag = true;

                        if (System.Windows.Forms.MessageBox.Show("Attenzione!...Giacenza totale insufficiente. Continuare?",
                                           "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            retValue = false;
                            return retValue;
                        }
                    }
                }
                //.......ERRORE: Giacenza totale insufficiente--fine

                //.......ERRORE: Giacenza lotto insufficiente--inizio
                if (ope == "A")
                {
                    if (Math.Round((((Lotto)this.dynListvLotti.CheckedItems[0].Tag).Giacenza), 2) < Math.Round(quant, 2))
                    {

                        if (System.Windows.Forms.MessageBox.Show("Attenzione!...Giacenza lotto insufficiente. Continuare?",
                            "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            retValue = false;
                            return retValue;
                        }
                        else
                        {
                            m_giacenzaInsufficienteflag = true;
                        }

                    }
                }
                //if (ope == "M" && (quant > quant_old))
                if (ope == "M")
                {
                    double m_giacOld = (((Lotto)this.dynListvLotti.CheckedItems[0].Tag).Giacenza) + quant_old;
                    if (Math.Round(quant, 2) > Math.Round(m_giacOld, 2))
                    {

                        if (System.Windows.Forms.MessageBox.Show("Attenzione!...Giacenza lotto insufficiente. Continuare?",
                            "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            retValue = false;
                            return retValue;
                        }
                        else
                        {
                            m_giacenzaInsufficienteflag = true;
                        }
                    }
                }
                //.......ERRORE: Giacenza lotto insufficiente--fine

                //.......ERRORE: Sottoscorta--inizio
                if (ope == "A")
                {
                    if (Math.Round(m_polvere.ScortaMinima, 2) > Math.Round((m_polvere.Giacenza.GetValueOrDefault() - quant), 2))
                    {
                        m_sottoScortaFlag = true;

                        if (System.Windows.Forms.MessageBox.Show("Attenzione!...Giacenza totale inferiore alla Scorta minima. Continuare?",
                                                                 "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            retValue = false;
                            return retValue;
                        }
                    }
                }
                if (ope == "M")
                {
                    if (Math.Round(m_polvere.ScortaMinima, 2) > Math.Round((m_polvere.Giacenza.GetValueOrDefault() + quant_old - quant), 2))
                    {
                        m_sottoScortaFlag = true;

                        if (System.Windows.Forms.MessageBox.Show("Attenzione!...Giacenza totale inferiore alla Scorta minima. Continuare?",
                                                                 "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            retValue = false;
                            return retValue;
                        }
                    }
                }
            }
            //.......ERRORE: Sottoscorta--fine


            Lotto m_lottoSelezionato = (Lotto)this.dynListvLotti.CheckedItems[0].Tag;  // lotto selezionato...
            Lotto m_lottoAnziano = (Lotto)this.dynListvLotti.Items[0].Tag;  // lotto selezionato piu' vecchio...
           
            if (DateTime.Compare(m_lottoAnziano.DataDdt, m_lottoSelezionato.DataDdt) != 0)
            {
                if (System.Windows.Forms.MessageBox.Show("Attenzione!...Non è stato selezionato il lotto più vecchio. Continuare?",
                                                         "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    retValue = false;
                    return retValue;
                }
            }

            if (DateTime.Compare(m_lottoSelezionato.DataScadenzaLotto, DateTime.Now) < 0)
            {
                if (System.Windows.Forms.MessageBox.Show("Attenzione!...E' stato selezionato un lotto scaduto. Continuare?",
                                                         "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    retValue = false;
                    return retValue;
                }
            }

            return retValue;
        }

        private CoreWebLibrary.Validation.Windows.BrokenRulesStyleCollection SetStyles()
        {
            //Set up the styles.  Likely this would be done in a BasePage or some other
            //central location.
            CoreWebLibrary.Validation.Windows.BrokenRulesStyleCollection brokenRulesStyles = new CoreWebLibrary.Validation.Windows.BrokenRulesStyleCollection();

            return brokenRulesStyles;
        }
        #endregion

        private void chkbLottiNulli_CheckedChanged(object sender, EventArgs e)
        {
            Polvere m_polvere = (Polvere)this.dynCmbPolveri.SelectedValue;
            if (m_polvere.ID != -1)
            {
                if (chkbLottiNulli.Checked == true)
                {
                    if (this.Movimento == null)
                    {
                        LoadLottiAll(m_polvere.ID, 0);
                    }
                    else
                    {
                        LoadLottiAll(m_polvere.ID, this.Movimento.IDLotto);
                    }
                }
                else
                {
                    if (this.Movimento == null)
                    {
                        LoadLotti(m_polvere.ID, 0);
                    }
                    else
                    {
                        LoadLotti(m_polvere.ID, this.Movimento.IDLotto);
                    }
                }
            }
        }

        private void dyndataMovimentoDateTimePicker_ValueChanged(object sender, EventArgs e)
        {
            if (this.Movimento != null)
            {
                if (this.Movimento.DataMovimento != this.dyndataMovimentoDateTimePicker.Value)
                {
                    m_dataMovimentoChangedBag = new GestionePolveriLib.BL.DataMovimentoChangedBag();
                    m_dataMovimentoChangedBag.OriginalDate = this.Movimento.DataMovimento;
                    m_dataMovimentoChangedBag.OriginalImpianto = this.Impianto;
                    m_dataMovimentoChangedBag.OriginalTurno = this.Turno;

                    POS m_originalPOS = new GestionePolveriLib.BL.POS();
                    m_originalPOS.DateOfPos = this.Movimento.DataMovimento;
                    m_originalPOS.IDImpianto = this.Impianto.ID;
                    m_originalPOS.IDOperatore = this.Movimento.IDOperatore.Value;
                    m_originalPOS.IDTurno = this.Turno.Id;
                    m_originalPOS.POSValue = this.Movimento.POS.Value;
                    m_dataMovimentoChangedBag.OriginalPOS = m_originalPOS;

                    m_dataMovimentoChangedBag.NewDate = this.dyndataMovimentoDateTimePicker.Value;
                    m_dataMovimentoChangedBag.NewImpianto = this.Impianto;
                    m_dataMovimentoChangedBag.NewTurno = this.Turno;

                    m_dataMovimentoChanged = true;
                }
            }
        }
    }
}
